
# 图片，验证码，干扰线，干扰点，颜色
# 类 ==》 方法
import string,random,os
#               画布     画笔      字体         模糊
from PIL import Image, ImageDraw, ImageFont, ImageFilter
class VerifyUtil:
    # 140  40 ==> 前端文件 140 40
    #                 图宽       图高         验证码个数   字体大小
    def __init__(self,width = 140,height = 40,length = 4,size = 28):
        self.width = width
        self.height = height
        self.length = length
        self.size = size

    # 生成验证码的方法
    def random_str(self):
        """
        :return:  验证码  ==》 str
        """
        res = string.ascii_letters + string.digits
        # 4个数字
        return "".join(random.choices(res,k = self.length))# ["a","b"]

    # 颜色
    # rgb(0,0,0) -rgb(255,255,255) ==>rgb(152,25,133)
    def random_color(self):  # 0 - 255
        """
        :return: 颜色rgb ==> tuple
        """
        # li = []
        # for i in range(3):
        #     random.randint(0, 255)
        #     li.append(random.randint(0, 255))
        li = [random.randint(0, 255) for i in range(3)]
        return tuple(li)


    # 干扰线
    def random_lines(self,draw):
        """
        画线（x,y） (x,y)  ==>x:0:140  y:0:40
        :param draw: 画笔
        :return: None
        """
        # random.randint(0,self.width) # ==>x
        # random.randint(0,self.height) # ==>y
        # (random.randint(0,self.width),random.randint(0,self.height)) #(x,y)
        for i in range(6):
            lines = [(random.randint(0,self.width),random.randint(0,self.height)) for i in range(2)]
            # 画线   [(x,y),(x,y)] , 颜色 , 线条粗细
            draw.line(lines,fill=self.random_color(),width=2)

    # 干扰点
    def random_points(self,draw):
        """
        画点
        :param draw: 画笔
        :return:  None
        """
        for i in range(self.width): # 获取行
            for j in range(self.height): # 获取列
                # 随机数字 来控制干扰点的比例
                if random.randint(0,100) <= 10:  # 10%
                    draw.point((i,j),fill=self.random_color())

    # 综合方法
    def verify_code(self):
        """

        :return:  图片信息   验证码信息
        """
        # 生成画布
        image = Image.new('RGB',(self.width,self.height),(255,255,255))
        # 字体文件 dirname() 获取文件夹  abspath()获取绝对路径
        file = os.path.dirname(os.path.abspath(__file__)) # /home/bd/djangodemo/jutong32/jt32/utils
        font = ImageFont.truetype(f"{file}/HYYakuHei-85W.ttf",self.size)
        # 生成画笔 通过画布对象创建画笔对象
        draw = ImageDraw.Draw(image)
        # 验证码 干扰线 颜色  干扰点
        self.random_lines(draw)
        self.random_points(draw)
        code = self.random_str() # ABCD
        # 验证码填入画布  x轴要发生偏移量的变化
        # (0,5) (35,5),(35+35,5),(35+35+35,5)
        for i in range(self.length): # 0 ,1 2 3
            # text(（x,y）,验证码内容 ，字体，颜色)
            draw.text((i*35,5),code[i],font=font,fill=self.random_color())
        # 可以加也可以不加  BLUR 高斯模糊
        # image = image.filter(ImageFilter.BLUR)
        return image,code

# if __name__ == '__main__':
#     imgverifyUtil = VerifyUtil()
#     # print(imgverifyUtil.verify_code())
#     img,code = imgverifyUtil.verify_code()
#     with open("test.png","wb") as f:
#         img.save(f)
#     print(code)